package jamirr;

public interface PropertyMirror<B, T> extends MemberMirror<B>, Named {

    /**
     * 属性类型
     *
     * @return 属性类型
     */
    Class<T> getPropertyType();

    /**
     * 读取 ClassMirror 值。
     *
     * @param instance 要读取的 ClassMirror 实例
     * @return 值
     * @throws IllegalArgumentException 如果 ClassMirror 实例不是正确的类型
     */
    T get(B instance);

    /**
     * 写入 ClassMirror 值。
     *
     * @param instance 要写入的 ClassMirror 实例
     * @param value    要写入的值
     * @throws IllegalArgumentException 如果 ClassMirror 类型或值类型不正确
     */
    void set(B instance, T value);

    /**
     * @return 属性是否为只读
     */
    default boolean isReadOnly() {
        return false;
    }

    /**
     * @return 属性是否为只写
     */
    default boolean isWriteOnly() {
        return false;
    }

    /**
     * 属性是否可读可写。
     *
     * @return 如果可读可写则返回 true
     */
    default boolean isReadWrite() {
        return !isReadOnly() && !isWriteOnly();
    }
}
